package com.vdong.redis.data.core.json.ops;

import com.vdong.redis.data.core.json.DBExecutor;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.ScanOptions;

import java.util.*;
import java.util.concurrent.TimeUnit;


/**
 * ops覆盖接口，用于动态代理
 *
 * @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
 * @since JDK 1.6 create on 2017年3月31日 Copyright 2017 ZZJR All Rights Reserved.
 */
public interface FastJsonBoundHashOperations<K, HK, HV> extends BoundHashOperations<K, HK, HV> {
    @Deprecated
    void put(HK hashKey, HV value, DBExecutor<HV> db);

    @Deprecated
    void put(HK hashKey, HV value, DBExecutor<HV> db, Long timeout, TimeUnit unit);

    @Deprecated
    HV get(HK hashKey, DBExecutor<HV> db);

    @Deprecated
    HV get(HK hashKey, DBExecutor<HV> db, Long timeout, TimeUnit unit);

    /**
     * 根据hashkey，获得指定类型的值
     *
     * @param hashKey
     * @param type
     * @return
     */
    <T> T get(HK hashKey, Class<T> type);

    @Deprecated
    <T> T get(HK hashKey, Class<T> type, DBExecutor<T> db);

    @Deprecated
    <T> T get(HK hashKey, Class<T> type, DBExecutor<T> db, Long timeout, TimeUnit unit);

    /**
     * 获得当前key
     */

    K getKey();

    /**
     * 获得当前存储的类型
     */

    DataType getType();

    /**
     * 获得过期时间
     */

    Long getExpire();

    /**
     * 设置过期时间
     */

    Boolean expire(long timeout, TimeUnit unit);

    /**
     * 设置过期日期
     */

    Boolean expireAt(Date date);

    /**
     * 撤销过期时间
     */

    Boolean persist();

    /**
     * 重新设置key
     */

    void rename(K newKey);

    /**
     * 删除hashkey
     */

    Long delete(Object... keys);

    /**
     * 包含hashkey
     */

    Boolean hasKey(Object key);

    /**
     * 根据hashkey得到value
     */

    HV get(Object key);

    /**
     * 根据多个hashkey得到多个value
     */

    List<HV> multiGet(Collection<HK> keys);

    /**
     * 指定key自增指定大小
     */

    Long increment(HK key, long delta);

    /**
     * 指定key自增指定大小
     */

    Double increment(HK key, double delta);

    /**
     * 得到所有hashkey
     */

    Set<HK> keys();

    /**
     * 得到个数
     */

    Long size();

    /**
     * 设置多个值
     */

    void putAll(Map<? extends HK, ? extends HV> m);

    /**
     * 设置值
     */

    void put(HK key, HV value);

    /**
     * 设置值，如果该hashkey下的值不存在
     */

    Boolean putIfAbsent(HK key, HV value);

    /**
     * 得到所有值
     */

    List<HV> values();

    /**
     * 得到所有key和值
     */

    Map<HK, HV> entries();

    /**
     * 得到游标
     */

    Cursor<Map.Entry<HK, HV>> scan(ScanOptions options);

    /**
     * 得到操作对象
     */

    RedisOperations<K, ?> getOperations();

}
